package com.tl.demo;

import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

import com.cdoframework.cdolib.net.HttpClient;

public class MMSHandle {
	
	/**
	 * 发送彩信
	 * 
	 * @param strMobile (String)全部被叫号码(发信发送的目的号码.多个号码之间用半角逗号隔开)
	 * @param strSubject (String)发送彩信的标题
	 * @paramstrID (String)彩信接受人的ID
	 * 
	 * @return 发送结果（xml格式的字符串）
	 * */
	public static final String sendMms(String strMobile, String strSubject, String strContent) throws IOException {
		
		String strUserid = "xd000352";		// 企业id
		String strAccount = "xd000352";		// 发送用户帐号
		String strPassword = "xd00035223";	// 发送帐号密码
		String strSendTime = "";			// 定时发送时间
		String strExtno = "";				// 扩展子号
		
		// 发送短信
		String strReslult = sendMms(strUserid, strAccount, strPassword, strMobile, strSubject, strContent, strSendTime, strExtno);
		
		return strReslult;
	}
	
	/**
	 * 彩信发送
	 * 
	 * @param strUserid (String)企业id
	 * @param strAccount (String)发送用户帐号
	 * @param strPassword (String)发送帐号密码
	 * @param strMobile (String)全部被叫号码(发信发送的目的号码.多个号码之间用半角逗号隔开)
	 * @param strSubject (String)发送彩信的标题
	 * @param strContent (String)发送内容(为空表示立即发送，定时发送格式2010-10-24 09:08:10)
	 * @param strSendTime (String)定时发送时间
	 * @param strExtno (String)扩展子号(请先询问配置的通道是否支持扩展子号，如果不支持，请填空)
	 * 
	 * @return 发送结果（xml格式的字符串）
	 * */
	public static String sendMms(String strUserid, String strAccount, String strPassword, String strMobile, String strSubject,
						  String strContent, String strSendTime, String strExtno) {
		
		HttpClient httpClient = new HttpClient();
		
		// 请求结果
		String strResult = "";
		
		// 拼接请求参数
		String parameter = "action=send&userid="+ strUserid + "&account=" + strAccount + "&password="
				  + strPassword + "&mobile=" + strMobile + "&subject="
				  + strSubject + "&content=" + strContent + "&sendTime="
				  + strSendTime + "&extno=" + strExtno + "";

		try {
			strResult = httpClient.postForText("http://dx.ipyy.net/mms.aspx", parameter);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return strResult;
	}
	
	/**
	 * base64编码
	 * 
	 * @param bstr (byte[])需要转码的内容
	 * 
	 * @return 经过Base64转码的字符窜
	 * */
	public static String EncodeBase64(byte[] bstr) {
		String enBase64 = new sun.misc.BASE64Encoder().encode(bstr);
		return enBase64;
	}
	
	/**
	 * 发送二维码(主要服务于国际会议)
	 * 
	 * @param mapModel 模板
	 * @param mapContent 内容
	 * @param strFilePath 文件存储位置
	 * */
	
	public static String sendQrMms(Map<String, String> mapModel, Map<String, String> mapContent, String strFilePath){
		
//		// 如果目录不存在则创建目录
//		File fileRoot = new File(strFilePath);
//		if (!fileRoot.isDirectory()) {
//			fileRoot.mkdirs();
//		}
//		
//		String strMMSTile = mapModel.containsKey("title")?mapModel.get("title"):"";	// 彩信标题
//		String strMobile = mapContent.get("strMobile") + "";	// 手机号码
		String strState = "failure";	// 处理状态
//		
//		// 生成文本内容
//		if (mapModel.containsKey("content")) {
//			
//			String strContent = mapModel.get("content");
//			String filePaht = strFilePath + "/content_" + strMobile + ".txt";
//			
//			// 输出文件
//			try {
//				
//				// 创建文件
//				File file = new File(filePaht);
//				if(!file.exists()){
//					file.createNewFile();
//				}
//				
//				// 设置编码并输出内容
//				Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePaht), "GBK"));
//				out.write(strContent);
//				out.close();
//				
//			} catch (IOException e) {
//				e.printStackTrace();
//			}
//			
//		}
//		
//		// 生成二维码图片内容
//		if (mapModel.containsKey("qr")) {
//			
//			String strImgPath = strFilePath + "/QR_" + strMobile + ".jpg";	// 图片路径
//			String strQrModel = mapModel.get("qr");		// 获取内容
//			
//			// 生成QR图片
//			QRHandle.encoderQRCode(strQrModel, strImgPath, "jpg", 12);
//		}
//		
//		// 生成smil
//		if (mapModel.containsKey("sequence")) {
//			String strSequence = mapModel.get("sequence");
//			
//			creatSmil(strSequence, strFilePath, strMobile);
//		}
//		
//		try {
//			
//			String strResult = sendMms(strMobile, strMMSTile, getContent(strMobile, strFilePath));
//			
//			// 删除多余文件
//			File fileText = new File(strFilePath + "/content_" + strMobile + ".txt");
//			File fileQr = new File(strFilePath + "/QR_" + strMobile + ".jpg");
//			File fileSmil = new File(strFilePath + "/mms.smil");
//			
//			fileText.delete();
//			fileQr.delete();
//			fileSmil.delete();
//			
//			// 返回处理结果
//			if (strResult.indexOf("操作成功") != -1) {
//				return strState = "success";
//			}
//		} catch (IOException e) {
//			e.printStackTrace();
//		}
//		
//		// 返回最终处理结果
		return strState;
	}
	
	/**
	 * 将名称和内容byte[]转换为彩信需求内容格式
	 * 
	 * @param name (String) 内容名称,注意：需要为文件的全称(包含扩展名)
	 * @param inputByte (byte[]) 需要转换的内容
	 * 
	 * @return 符合要求的byte[]
	 * */
	private static byte[] contentTobyte(String strName, byte[] bInputByte) throws IOException{
		
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		
		// 元素名称+一个字符串结束符(即，ASCII的0)
		byte[] nameByte = (strName+"\0").getBytes("ascii");
		out.write(nameByte);
		
		// 元素的二进制内容大小（整形）
		int inputByteLength = bInputByte.length;
		
		byte[] lengthByte = new byte[4];
		lengthByte[0] = (byte) ((inputByteLength >> 0)&0xFF);
		lengthByte[1] = (byte) ((inputByteLength >> 8)&0xFF);
		lengthByte[2] = (byte) ((inputByteLength >> 16)&0xFF);
		lengthByte[3] = (byte) ((inputByteLength >> 24)&0xFF);
		out.write(lengthByte);
		
		// 元素的二进制内容
		out.write(bInputByte);
		
		// 将拼接内容转换为byte[],并输出
		byte[] allbyte=out.toByteArray();
		out.close();
		
		// 返回结果
		return allbyte;
	}
	
	/**
	 * smil文件生成
	 * 
	 * @param strSequences 彩信内容顺序
	 * @param strFilePath 文件存储位置
	 * @param strMobile 手机号
	 * */
	private static void creatSmil(String strSequences, String strFilePath, String strMobile) {
		
		String strFileName = strFilePath + "/mms.smil";	// smil文件全称
		
		StringBuffer bufferContent = new StringBuffer();	// smil文件内容
		
		// 拼接内容
		bufferContent.append("<smil>");
		bufferContent.append("<head>");
		bufferContent.append("<meta name=\"title\" content=\"\"/>");
		bufferContent.append("<layout>");
		bufferContent.append("<root-layout width=\"320px\" height=\"240px\" />");
		bufferContent.append("<region id=\"Text\" width=\"100%\" height=\"50%\" left=\"0px\" top=\"50%\" fit=\"scroll\" />");
		bufferContent.append("<region id=\"Image\" width=\"100%\" height=\"50%\" left=\"0px\" top=\"0px\" fit=\"meet\" />");
		bufferContent.append("</layout>");
		bufferContent.append("</head>");
		bufferContent.append("<body>");
		
		// 设置顺序
		if(strSequences.equals("textFrist"))
		{
			bufferContent.append("<par dur=\"5s\">");
			bufferContent.append("<text region=\"Text\" src=\"content_" + strMobile + ".txt" + "\" />");
			bufferContent.append("</par>");
			bufferContent.append("<par dur=\"5s\">");
			bufferContent.append("<img region=\"Image\" src=\"QR_" + strMobile + ".jpg" + "\" />");
			bufferContent.append("</par>");
		}
		else if (strSequences.equals("qrFirst")) 
		{
			bufferContent.append("<par dur=\"5s\">");
			bufferContent.append("<img region=\"Image\" src=\"content_" + strMobile + ".txt" + "\" />");
			bufferContent.append("</par>");
			bufferContent.append("<par dur=\"5s\">");
			bufferContent.append("<text region=\"Text\" src=\"QR_" + strMobile + ".jpg" + "\" />");
			bufferContent.append("</par>");
		}
		
		bufferContent.append("</body>");
		bufferContent.append("</smil>");
		
		// 输出文件
		try {
			
			// 创建文件
			File file = new File(strFileName);
			if(!file.exists()){
				file.createNewFile();
			}
			
			// 设置编码并输出内容
			Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(strFileName), "GBK"));
			out.write(bufferContent.toString());
			out.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 读取文件并转换为相应的byte[]
	 * 
	 * @param pathname (String) 文件路径
	 * 
	 * @return 文件的byte[]
	 * */
	private static byte[] readFile(String strPathname) {

		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		File file = new File(strPathname);
		
		byte[] buf = new byte[512];
		try {
			FileInputStream fis = new FileInputStream(file);
			int n = 0;
			while ((n = fis.read(buf)) != -1) {
				bos.write(buf, 0, n);
			}
			fis.close();
		} catch (Exception e) {
		}
		
		return bos.toByteArray();

	}

	/**
	 * 获取短信发送内容
	 * 
	 * @param strMobile (String)彩信接受人的手机
	 * @param strFilePath (String)文件地址
	 * 
	 * @return 符合彩信接口的彩信内容
	 * */
	private static String getContent(String strMobile, String strFilePath) throws IOException {
		
		String result = "";			// 最终结果
		String name = "";			// 文件名(包含扩展名)
		String fileAddress = "";	// 文件地址
		
		ByteArrayOutputStream saveStream = new ByteArrayOutputStream();	//中转、拼接byte[]
		
		// description.txt部分
		name = "content_" + strMobile + ".txt";
		fileAddress = strFilePath + "/" + name;
		
		byte[] description = contentTobyte(name, readFile(fileAddress));
		saveStream.write(description);
		
		// 图片部分
		name = "QR_" + strMobile + ".jpg";
		fileAddress = strFilePath + "/" + name;
		
		byte[] iamge = contentTobyte(name, readFile(fileAddress));
		saveStream.write(iamge);
		
		// smil部分
		name = "mms.smil";
		fileAddress = strFilePath + "/" + name;
		
		byte[] smil = contentTobyte(name, readFile(fileAddress));
		saveStream.write(smil);
		
		// 转换成相应结果字符串
		byte[] resultByte = saveStream.toByteArray();
		result = URLEncoder.encode(EncodeBase64(resultByte), "utf-8");
		
		return result;
	}
	
	
	public static void main(String[] args) {
		
		String strFilePahtString = "F:\\work\\project\\img\\sendwTest";
		
		Map<String, String> mapModel = new HashMap<String, String>();
		mapModel.put("title", "来自新锦成");
		mapModel.put("content", "已缴费凭证二维码，请妥善保管此二维码，勿告知他人，凭此在报道地点换取参会证件，感谢您的参与！");
		mapModel.put("qr", "strName||姓名__strMobile||手机");
		mapModel.put("sequence", "textFrist");
		
		Map<String, String> mapContent = new HashMap<String, String>();
		mapContent.put("strName", "郭子坤");
		mapContent.put("strMobile", "18612466550");
		
		new MMSHandle().sendQrMms(mapModel, mapContent, strFilePahtString);
	}
}

